package com.github.xtranslation.core.repository.dict;


import com.github.xtranslation.core.annotation.DictTrans;
import com.github.xtranslation.core.repository.TransRepository;
import io.vavr.control.Option;

import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toMap;

/**
 * DictTransRepository: 字典翻译仓库
 * <p>
 * 字典翻译功能的核心数据访问组件，负责根据字典分组标识加载和提供字典数据。
 * 实现了TransRepository接口，专门处理基于字典的翻译场景。
 * </p>
 * <p>
 * 核心职责：
 * 1. 数据访问：通过DictLoader加载字典数据
 * 2. 翻译支持：为字典翻译提供数据支持
 * 3. 注解处理：处理DictTrans注解中的字典分组信息
 * </p>
 *
 * @see DictLoader
 * @see DictTrans
 * @see TransRepository
 * @author zhangxiaoxiang
 * @since 2025/7/27
 */
public class DictTransRepository implements TransRepository {

    /**
     * 字典加载器，用于实际加载字典数据
     * <p>
     * 通过构造函数注入，支持用户自定义实现。
     * 负责从数据源（如数据库、配置文件等）加载字典数据。
     * </p>
     */
    private final DictLoader dictLoader;

    /**
     * 构造函数
     * <p>
     * 通过依赖注入方式传入字典加载器。
     * </p>
     *
     * @param dictLoader 字典加载器，不能为空
     */
    public DictTransRepository(DictLoader dictLoader) {
        this.dictLoader = dictLoader;
    }

    /**
     * 获取翻译值映射
     * <p>
     * 根据DictTrans注解中的字典分组标识，从DictLoader加载对应的字典数据。
     * </p>
     * <p>
     * 处理流程：
     * 1. 检查dictLoader是否可用且注解为DictTrans类型
     * 2. 从DictTrans注解中获取字典分组标识
     * 3. 通过dictLoader加载字典数据
     * 4. 构造并返回翻译值映射
     * </p>
     *
     * @param transIdList 翻译值列表（在字典翻译中通常不使用）
     * @param transAnno   翻译注解，应为DictTrans类型
     * @return 翻译值映射
     * 当无法加载数据时返回空Map
     */
    @Override
    public Map<Object, Object> getTransValueMap(List<Object> transIdList, Annotation transAnno) {
        // 使用Option处理dictLoader不为空且transAnno是DictTrans类型实例的情况
        return Option.of(dictLoader)
                .filter(loader -> transAnno instanceof DictTrans)
                // 使用Stream.of方法创建一个包含group的流，并收集为Map，键为group，值为通过dictLoader加载的字典
                .map(loader -> (Map<Object, Object>) new HashMap<Object, Object>(Stream.of(((DictTrans) transAnno).group()).collect(toMap(x -> x, dictLoader::loadDict)))).getOrElse(Collections.emptyMap());
    }


}
